﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;
using Autofac;
using ComputerVision.BaseForm;
using ComputerVision.Common;
using ComputerVision.Data;
using ComputerVision.VeXeForm;
using ComputerVision.Services;

namespace ComputerVision.VeXeForm
{
    public partial class frmVeXeList : frmList
    {
        private IService<VeXe> _veXeService;
        AutoCompleteStringCollection autoList;
        private readonly IService<LoaiVe> _loaiVeXeService;

        public frmVeXeList()
        {
            InitializeComponent();
            _loaiVeXeService = Program.Container.Resolve<IService<LoaiVe>>();
            _veXeService = Program.Container.Resolve<IService<VeXe>>();
            BindType();
        }

        protected override void LoadData()
        {
            _veXeService = Program.Container.Resolve<IService<VeXe>>();
            veXeBindingSource.DataSource = _veXeService.ToList().ToList().Select(p => new { p.SoVe, p.Status, Xe = p.LoaiVe.TenLoai, p.Created }).OrderByDescending(a => a.Created).ToList();

        }

        protected override void Add()
        {
            using (var frm = new frmVeXeDetail())
            {
                frm.OnLoadData += LoadData;
                frm.ShowDialog();
            }
        }

        protected override void Edit()
        {
            EditData();
        }

        private void EditData()
        {
            if (dgvVeXe.SelectedRows.Count > 0)
            {
                var selectedRow = dgvVeXe.SelectedRows[0];
                var id = selectedRow.Cells[0].Value.ToString().Trim();
                using (var fEdit = new frmVeXeDetail(id))
                {
                    fEdit.OnLoadData += LoadData;
                    fEdit.ShowDialog();
                }
            }
            else
            {
                AlertList.Error("Lỗi trong quá trình sửa dữ liệu");
            }
        }

        private void DeleteData()
        {
            try
            {
                if (dgvVeXe.SelectedRows.Count != 0)
                {
                    var id = dgvVeXe.SelectedRows[0].Cells[0].Value.ToString().Trim();
                    if (DialogResult.Yes == AlertList.Question(Constants.Messages.DeleteConfirm))
                    {
                        var item = _veXeService.Detail(id);
                        _veXeService.Delete(item);
                        LoadData();
                    }
                }
                else
                {
                    AlertList.Error(Constants.Messages.UpdateSelectItemError);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        protected override void Delete()
        {
            DeleteData();
        }

        private void BindType()
        {
            cbType.Items.Add("Số vé");
            cbType.Items.Add("Trạng Thái");
            cbType.Items.Add("Loại vé");
            cbType.SelectedItem = cbType.Items[0];
        }

        private void btTimKiem_Click(object sender, EventArgs e)
        {
            switch (cbType.SelectedIndex)
            {
                case 0:
                    if (txtSoVe.Text.Trim() != "")
                    {
                        _veXeService = Program.Container.Resolve<IService<VeXe>>();
                        veXeBindingSource.DataSource = _veXeService.ToList().Where(a => a.SoVe.Contains(txtSoVe.Text.Trim())).Select(p => new { p.SoVe, p.Status, Xe = p.LoaiVe.TenLoai, p.Created }).OrderBy(a => a.SoVe);
                    }
                    else
                    {
                        AlertList.Information("Bạn phải nhập số thẻ hoặc một phần của số thẻ.");
                    }
                    break;

                case 1:
                    if (txtSoVe.Text.Trim() != "")
                    {
                        _veXeService = Program.Container.Resolve<IService<VeXe>>();
                        veXeBindingSource.DataSource = _veXeService.ToList().Where(a => a.Status.Equals(txtSoVe.Text.Trim())).Select(p => new { p.SoVe, p.Status, Xe = p.LoaiVe.TenLoai, p.Created }).OrderBy(a => a.SoVe);
                    }
                    else
                    {
                        AlertList.Information("Bạn phải nhập đúng tên trạng thái.");
                    }

                    break;

                case 2:
                    if (txtSoVe.Text.Trim() != "")
                    {
                        _veXeService = Program.Container.Resolve<IService<VeXe>>();
                        veXeBindingSource.DataSource = _veXeService.ToList().Where(a => a.LoaiVe.TenLoai.Equals(txtSoVe.Text.Trim())).Select(p => new { p.SoVe, p.Status, Xe = p.LoaiVe.TenLoai, p.Created }).OrderBy(a => a.SoVe);
                    }
                    else
                    {
                        AlertList.Information("Bạn phải nhập đúng tên loại vé.");
                    }
                    break;
            }

            

        }

        private void cbType_SelectedIndexChanged(object sender, EventArgs e)
        {
            autoList = new AutoCompleteStringCollection();
            switch (cbType.SelectedIndex)
            {
                case 0:
                    txtSoVe.AutoCompleteCustomSource = null;
                    break;

                case 1:
                    autoList.Add(Constants.StatusVeXe.Active);
                    autoList.Add(Constants.StatusVeXe.InActive);
                    autoList.Add(Constants.StatusVeXe.MatVe);

                    txtSoVe.AutoCompleteCustomSource = autoList;

                    break;

                case 2:
                    var items = _loaiVeXeService.ToList().ToList();
                    foreach (LoaiVe loaiVe in items)
                    {
                        autoList.Add(loaiVe.TenLoai);
                    }
                    txtSoVe.AutoCompleteCustomSource = autoList;
                    break;
            }
        }

    }
}
